package org.yamcs.ui.eventviewer;
import java.awt.BorderLayout;
import java.awt.ComponentOrientation;
import java.awt.Dimension;
import java.awt.Frame;
import java.awt.GridBagConstraints;
import java.awt.GridLayout;
import java.awt.Toolkit;
import java.awt.Window;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.BoxLayout;
import javax.swing.DefaultCellEditor;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JDialog;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTabbedPane;
import javax.swing.JTable;
import javax.swing.ListSelectionModel;
import javax.swing.WindowConstants;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.TableColumn;
import javax.swing.table.TableColumnModel;
/**
* Preferences dialog under Edit->Preferences menu. Dialog is modal.
*
* @author mu
*/
public class PreferencesDialog extends JDialog implements ActionListener {
private static final long serialVersionUID = 1L;
private JPanel jContentPane = null; // @jve:decl-index=0:visual-constraint="10,10"
private JTabbedPane jTabbedPane = null; // tabbed pane with
// alert and rule
// configuration
private JPanel jPanelRules = null; // panel with event
// filtering rules
// configuration
private JPanel jPanelAlerts = null; // panel with alert
// configuration
private JPanel jPanelLeft = null;
private JPanel jPanelRight = null;
private JScrollPane jScrollPane = null;
private JPanel jPanelButtons = null;
private JButton jButtonClose = null;
private JButton jButtonCancel = null;
private JPanel jPanelWest = null;
private JPanel jPanelSouth = null;
private EventViewer eventViewer = null;
private JTable filteredTable = null;
private JButton jButtonAdd = null; // button to add the
// rule
private JButton jButtonRemove = null; // button to remove
// the rule
private JButton jButtonMoveUp = null; // button to move the
// rule up
private JButton jButtonMoveDown = null; // button to move the
// rule down
/**
* @param owner
* @param modal
*/
public PreferencesDialog(Frame owner, boolean modal)
{
super(owner, modal);
initialize();
}
/**
* @param owner
* @param title
*/
public PreferencesDialog(Frame owner, String title)
{
super(owner, title);
initialize();
}
/**
* @param owner
* @param modalityType
*/
public PreferencesDialog(Window owner, ModalityType modalityType)
{
super(owner, modalityType);
initialize();
}
/**
* @param owner
* @param title
* @param modalityType
*/
public PreferencesDialog(Window owner, String title, ModalityType modalityType)
{
super(owner, title, modalityType);
initialize();
}
/**
* This method initializes jTabbedPane
*
* @return javax.swing.JTabbedPane
*/
private JTabbedPane getJTabbedPane()
{
if (jTabbedPane == null)
{
jTabbedPane = new JTabbedPane();
jTabbedPane.setPreferredSize(new Dimension(260, 270));
jTabbedPane.setName("");
jTabbedPane.addTab("Filtering table", null, getJPanelRules(), "Configuration of event filtering rules");
// jTabbedPane.addTab("Alerts", null, getJPanelAlerts(),
// "Configuration of alerts");
}
return jTabbedPane;
}
/**
* This method initializes jPanel
*
* @return javax.swing.JPanel
*/
private JPanel getJPanelRules()
{
if (jPanelRules == null)
{
jPanelRules = new JPanel();
jPanelRules.setLayout(new BorderLayout());
jPanelRules.add(getJPanelLeft(), BorderLayout.CENTER);
jPanelRules.add(getJPanelRight(), BorderLayout.EAST);
}
return jPanelRules;
}
/**
* This method initializes jPanel
*
* @return javax.swing.JPanel
*/
private JPanel getJPanelAlerts()
{
if (jPanelAlerts == null)
{
jPanelAlerts = new JPanel();
jPanelAlerts.setLayout(new BorderLayout());
}
return jPanelAlerts;
}
/**
* This method initializes jPanelLeft
*
* @return javax.swing.JPanel
*/
private JPanel getJPanelLeft()
{
if (jPanelLeft == null)
{
GridBagConstraints gridBagConstraints = new GridBagConstraints();
gridBagConstraints.fill = GridBagConstraints.BOTH;
gridBagConstraints.gridy = 0;
gridBagConstraints.weightx = 1.0;
gridBagConstraints.weighty = 1.0;
gridBagConstraints.gridx = 0;
jPanelLeft = new JPanel();
jPanelLeft.setLayout(new BoxLayout(jPanelLeft, BoxLayout.Y_AXIS));
// jPanelLeft.add(getJComboBox());
jPanelLeft.add(getJScrollPane());
}
return jPanelLeft;
}
/**
* This method initializes jPanelRight
*
* @return javax.swing.JPanel
*/
private JPanel getJPanelRight()
{
if (jPanelRight == null)
{
jPanelRight = new JPanel();
jPanelRight.setLayout(new BorderLayout());
jPanelRight.add(getJPanelWest(), BorderLayout.NORTH);
jPanelRight.add(getJPanelSouth(), BorderLayout.SOUTH);
}
return jPanelRight;
}
/**
* This method initializes jScrollPane
*
* @return javax.swing.JScrollPane
*/
private JScrollPane getJScrollPane()
{
if (jScrollPane == null)
{
jScrollPane = new JScrollPane();
jScrollPane.setViewportView(getJFilteredTable());
}
return jScrollPane;
}
/**
* This method initializes jPanelButtons
*
* @return javax.swing.JPanel
*/
private JPanel getJPanelButtons()
{
if (jPanelButtons == null)
{
jPanelButtons = new JPanel();
jPanelButtons.setLayout(new GridLayout(2, 1, 5, 3));
jPanelButtons.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);
jPanelButtons.add(getJButtonClose());
}
return jPanelButtons;
}
/**
* This method initializes jButtonOk
*
* @return javax.swing.JButton
*/
private JButton getJButtonClose()
{
if (jButtonClose == null)
{
jButtonClose = new JButton();
jButtonClose.setText(" Close ");
jButtonClose.setActionCommand("close");
jButtonClose.addActionListener(this);
}
return jButtonClose;
}
private JButton getJButtonMoveUp()
{
if (jButtonMoveUp == null)
{
jButtonMoveUp = new JButton();
jButtonMoveUp.setText("Up");
jButtonMoveUp.setActionCommand("move_up_rule");
jButtonMoveUp.addActionListener(this);
}
return jButtonMoveUp;
}
private JButton getJButtonMoveDown()
{
if (jButtonMoveDown == null)
{
jButtonMoveDown = new JButton();
jButtonMoveDown.setText("Down");
jButtonMoveDown.setActionCommand("move_down_rule");
jButtonMoveDown.addActionListener(this);
}
return jButtonMoveDown;
}
/**
* This method initializes jButtonCancel
*
* @return javax.swing.JButton
*/
private JButton getJButtonCancel()
{
if (jButtonCancel == null)
{
jButtonCancel = new JButton();
jButtonCancel.setText("Cancel");
jButtonCancel.setActionCommand("cancel");
jButtonCancel.addActionListener(this);
}
return jButtonCancel;
}
/**
* This method initializes jPanelWest
*
* @return javax.swing.JPanel
*/
private JPanel getJPanelWest()
{
if (jPanelWest == null)
{
jPanelWest = new JPanel();
jPanelWest.setLayout(new GridLayout(5, 1, 5, 3));
jPanelWest.add(getJButtonAdd());
jPanelWest.add(getJButtonRemove());
jPanelWest.add(getJButtonMoveUp());
jPanelWest.add(getJButtonMoveDown());
}
return jPanelWest;
}
/**
* Access to Enable button
*
* @return
*/
private JButton getJButtonAdd()
{
if (jButtonAdd == null)
{
jButtonAdd = new JButton("Add");
jButtonAdd.setActionCommand("add_rule");
jButtonAdd.addActionListener(this);
}
return jButtonAdd;
}
/**
* Access to Disable button
*
* @return
*/
private JButton getJButtonRemove()
{
if (jButtonRemove == null)
{
jButtonRemove = new JButton("Delete");
jButtonRemove.setActionCommand("delete_rule");
jButtonRemove.addActionListener(this);
}
return jButtonRemove;
}
/**
* This method initializes jPanelSouth
*
* @return javax.swing.JPanel
*/
private JPanel getJPanelSouth()
{
if (jPanelSouth == null)
{
jPanelSouth = new JPanel();
jPanelSouth.setLayout(new BorderLayout());
jPanelSouth.add(getJPanelButtons(), BorderLayout.EAST);
}
return jPanelSouth;
}
/**
* @param args
*/
public static void main(String[] args)
{
PreferencesDialog diag = new PreferencesDialog(null, ModalityType.MODELESS);
diag.setVisible(true);
}
/**
* This method initializes this
*
* @return void
*/
private void initialize()
{
this.eventViewer = (EventViewer) getOwner();
this.setLocationByPlatform(true);
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
this.setSize(screenSize.width / 2, screenSize.height / 3);
this.setContentPane(getJContentPane());
this.setTitle("Preferences");
this.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE) ;
}
/**
* Table with events and alert status.
*
* @return
*/
public JTable getJFilteredTable()
{
if (filteredTable == null)
{
filteredTable = new JTable(eventViewer.getFilteringRulesTable()) {
@Override
public boolean isCellEditable(int row, int column)
{
return true;
}
};
filteredTable.getSelectionModel().setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
final TableColumnModel tcm = filteredTable.getColumnModel();
tcm.getColumn(FilteringRulesTable.ACTIVE_COL).setMaxWidth(80);
tcm.getColumn(FilteringRulesTable.SEVERITY_COL).setMaxWidth(140);
tcm.getColumn(FilteringRulesTable.ALERT_COL).setMaxWidth(80);
tcm.getColumn(FilteringRulesTable.SHOW_COL).setMaxWidth(80);
tcm.getColumn(FilteringRulesTable.ACTIVE_COL).setPreferredWidth(80);
tcm.getColumn(FilteringRulesTable.RULE_NAME_COL).setPreferredWidth(200);
tcm.getColumn(FilteringRulesTable.SOURCE_COL).setPreferredWidth(300);
tcm.getColumn(FilteringRulesTable.EVENT_TYPE_COL).setPreferredWidth(300);
tcm.getColumn(FilteringRulesTable.EVENT_MESSAGE_COL).setPreferredWidth(300);
tcm.getColumn(FilteringRulesTable.SEVERITY_COL).setPreferredWidth(120);
tcm.getColumn(FilteringRulesTable.ALERT_COL).setPreferredWidth(120);
tcm.getColumn(FilteringRulesTable.SHOW_COL).setPreferredWidth(120);
// Set up the editor for the active cells
JCheckBox checkBox = new JCheckBox();
TableColumn activeColumn = tcm.getColumn(FilteringRulesTable.ACTIVE_COL);
activeColumn.setCellEditor(new DefaultCellEditor(checkBox));
// Set up the editor for the severity cells
JComboBox comboBox = new JComboBox();
comboBox.addItem("Info");
comboBox.addItem("Warning");
comboBox.addItem("Error");
comboBox.addItem("Warning & Error");
comboBox.addItem("All");
TableColumn severityColumn = tcm.getColumn(FilteringRulesTable.SEVERITY_COL);
severityColumn.setCellEditor(new DefaultCellEditor(comboBox));
// Set up the editor for the alert cells
comboBox = new JComboBox();
comboBox.addItem("Sound");
comboBox.addItem("PopUp");
comboBox.addItem("None");
TableColumn alertColumn = tcm.getColumn(FilteringRulesTable.ALERT_COL);
alertColumn.setCellEditor(new DefaultCellEditor(comboBox));
// Set up tool tips for the sport cells.
DefaultTableCellRenderer renderer = new DefaultTableCellRenderer();
renderer.setToolTipText("Click to edit");
alertColumn.setCellRenderer(renderer);
// Set up the editor for the alert cells
comboBox = new JComboBox();
comboBox.addItem("Yes");
comboBox.addItem("No");
TableColumn showColumn = tcm.getColumn(FilteringRulesTable.SHOW_COL);
showColumn.setCellEditor(new DefaultCellEditor(comboBox));
// Set up tool tips for the show cells.
renderer = new DefaultTableCellRenderer();
renderer.setToolTipText("Click to edit");
showColumn.setCellRenderer(renderer);
}
return filteredTable;
}
/**
* This method initializes jContentPane
*
* @return javax.swing.JPanel
*/
private JPanel getJContentPane()
{
if (jContentPane == null)
{
jContentPane = new JPanel();
jContentPane.setLayout(new BorderLayout());
jContentPane.setSize(new Dimension(479, 259));
jContentPane.add(getJTabbedPane(), BorderLayout.CENTER);
}
return jContentPane;
}
@Override
public void actionPerformed(ActionEvent e)
{
String action = e.getActionCommand();
if (action.equals("close"))
{
this.setVisible(false);
eventViewer.getFilteringRulesTable().doNotifyAllObservers();
}
else if (action.equals("add_rule"))
{
addNewRule();
}
else if (action.equals("delete_rule"))
{
deleteRule();
}
else if (action.equals("move_up_rule"))
{
moveUpRule();
}
else if (action.equals("move_down_rule"))
{
moveDownRule();
}
else
{
assert (false);
}
}
/**
* Move the rule up.
*/
private void moveUpRule()
{
moveRule(-1);
}
/**
* Move the rule down
*/
private void moveDownRule()
{
moveRule(+1);
}
/**
* Moves the rule in the specified direction (up or down)
*
* @param direction Up (-1) or down (+1) direction
*/
private void moveRule(int direction)
{
// currently enable only one up/down step
if (direction != -1 && direction != 1)
{
return;
}
int selected = filteredTable.getSelectedRow();
if (selected == -1)
{
return;
}
int current = selected;
int future = selected + direction;
if (future < 0 || future >= filteredTable.getRowCount())
{
return;
}
eventViewer.getFilteringRulesTable().switchRules(current, future);
filteredTable.getSelectionModel().setSelectionInterval(future, future);
}
/**
* Add new filtering rule.
*/
private void addNewRule()
{
int selected = filteredTable.getSelectedRow();
if (selected == -1)
{
selected = 0;
}
FilteringRule rule = new FilteringRule();
rule.setName("Filtering rule");
eventViewer.getFilteringRulesTable().addRule(rule, selected);
filteredTable.getSelectionModel().setSelectionInterval(selected, selected);
}
/**
* Add new filtering rule. New rule is always added on the start of the
* list.
*/
public void addNewRule(FilteringRule rule)
{
rule.setName( rule.getSource() + " - " + rule.getEventType() );
eventViewer.getFilteringRulesTable().addRule(rule, 0);
filteredTable.getSelectionModel().setSelectionInterval(0, 0);
}
/**
* Delete existing filtering rule
*/
private void deleteRule()
{
int selected = filteredTable.getSelectedRow();
if (selected == -1)
{
return;
}
eventViewer.getFilteringRulesTable().removeRule(selected);
}
}
/**
* Alert setting representation in the filtering rule.
*/
enum AlertSetting {
AlertSound, AlertPopUp, AlertNone
}